const express = require('express');
const multer = require('multer');
const path = require('path');
const fs = require('fs');
const os = require('os');

// 获取本机IP地址
function getLocalIP() {
  const interfaces = os.networkInterfaces();
  for (const name of Object.keys(interfaces)) {
    for (const interface of interfaces[name]) {
      if (interface.family === 'IPv4' && !interface.internal) {
        return interface.address;
      }
    }
  }
  return 'localhost';
}

// 获取所有局域网IP地址
function getLocalIPs() {
  const interfaces = os.networkInterfaces();
  const ips = [];
  for (const name of Object.keys(interfaces)) {
    for (const interface of interfaces[name]) {
      if (interface.family === 'IPv4' && !interface.internal) {
        ips.push(interface.address);
      }
    }
  }
  return ips.length > 0 ? ips : ['localhost'];
}

// 获取本机IP地址
const localIP = getLocalIP();
const localIPs = getLocalIPs();

// 创建Express应用
const app = express();
const PORT = 3005;

// 配置文件上传
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    // 确保uploads目录存在
    const uploadDir = path.join(__dirname, 'uploads');
    if (!fs.existsSync(uploadDir)) {
      fs.mkdirSync(uploadDir, { recursive: true });
    }
    cb(null, uploadDir);
  },
  filename: function (req, file, cb) {
    // 保持原始文件名
    cb(null, file.originalname);
  }
});

const upload = multer({ storage: storage });

// 设置静态文件服务，提供上传文件的访问
// 修改静态文件路径，避免与API路由冲突
app.use('/uploads', express.static(path.join(__dirname, 'uploads')));

// 设置静态文件服务，提供前端页面
app.use(express.static(path.join(__dirname, 'public')));

// 解析JSON请求体
app.use(express.json());

// 解析URL编码的请求体
app.use(express.urlencoded({ extended: true }));

// 首页路由
app.get('/', (req, res) => {
  res.sendFile(path.join(__dirname, 'public', 'index.html'));
});

// 获取服务器信息接口
app.get('/api/info', (req, res) => {
  res.json({
    localIP: localIP,
    localIPs: localIPs,
    port: PORT
  });
});

// 上传文件接口
app.post('/upload', upload.single('file'), (req, res) => {
  if (!req.file) {
    return res.status(400).json({ error: '没有文件被上传' });
  }
  
  res.json({
    message: '文件上传成功',
    filename: req.file.originalname,
    size: req.file.size,
    // 修改文件访问URL路径
    url: `/uploads/${req.file.originalname}`
  });
});

// 获取文件列表接口
app.get('/api/files', (req, res) => {
  const uploadDir = path.join(__dirname, 'uploads');
  
  // 确保目录存在
  if (!fs.existsSync(uploadDir)) {
    fs.mkdirSync(uploadDir, { recursive: true });
  }
  
  // 读取目录中的文件
  fs.readdir(uploadDir, (err, files) => {
    if (err) {
      return res.status(500).json({ error: '读取文件列表失败' });
    }
    
    // 获取每个文件的详细信息
    const fileDetails = files.map(filename => {
      const filePath = path.join(uploadDir, filename);
      const stat = fs.statSync(filePath);
      return {
        name: filename,
        size: stat.size,
        modified: stat.mtime,
        // 修改文件访问URL路径
        url: `/uploads/${filename}`
      };
    });
    
    res.json(fileDetails);
  });
});

// 删除文件接口
app.delete('/api/files/:filename', (req, res) => {
  const filename = req.params.filename;
  const filePath = path.join(__dirname, 'uploads', filename);
  
  // 检查文件是否存在
  if (!fs.existsSync(filePath)) {
    return res.status(404).json({ error: '文件不存在' });
  }
  
  // 删除文件
  fs.unlink(filePath, (err) => {
    if (err) {
      return res.status(500).json({ error: '删除文件失败' });
    }
    
    res.json({ message: '文件删除成功' });
  });
});

// 下载文件接口 - 修复中文文件名乱码问题
app.get('/download/:filename', (req, res) => {
  const filename = req.params.filename;
  const filePath = path.join(__dirname, 'uploads', filename);
  
  // 检查文件是否存在
  if (!fs.existsSync(filePath)) {
    return res.status(404).json({ error: '文件不存在' });
  }
  
  // 设置正确的Content-Disposition头，解决中文文件名乱码问题
  const encodedFilename = encodeURIComponent(filename);
  res.setHeader('Content-Disposition', `attachment; filename*=UTF-8''${encodedFilename}`);
  res.setHeader('Content-Type', 'application/octet-stream');
  
  // 使用流式传输文件
  const fileStream = fs.createReadStream(filePath);
  fileStream.pipe(res);
  
  fileStream.on('error', (err) => {
    res.status(500).json({ error: '下载文件失败' });
  });
  
  res.on('finish', () => {
    fileStream.destroy();
  });
});

// 启动服务器
app.listen(PORT, '0.0.0.0', () => {
  console.log(`========================================`);
  console.log(`文件共享服务器已启动`);
  console.log(`========================================`);
  console.log(`本机IP地址: ${localIP}`);
  if (localIPs.length > 1) {
    console.log(`所有IP地址: ${localIPs.join(', ')}`);
  }
  console.log(`服务器地址: http://${localIP}:${PORT}`);
  // 修改文件访问地址显示
  console.log(`文件访问地址: http://${localIP}:${PORT}/uploads`);
  console.log(`上传文件地址: http://${localIP}:${PORT}/upload`);
  console.log(`========================================`);
  console.log(`局域网内的其他设备可以通过以下地址访问:`);
  localIPs.forEach(ip => {
    console.log(`  http://${ip}:${PORT}`);
  });
  console.log(`========================================`);
});

module.exports = app;